# 导入必要的模块
import network  # 用于WiFi网络配置和管理，提供AP模式和Station模式的支持
import socket  # 用于UDP网络通信，提供网络套接字编程接口
#from machine import Pin  # 用于控制ESP32/ESP8266的GPIO引脚，实现LED控制
import time  # 用于实现延时功能，控制LED闪烁间隔

# WiFi配置
SSID = 'ESP32_AP'  # WiFi接入点的名称，其他设备将看到此名称
PASSWORD = '12345678'  # WiFi接入点的密码，用于安全连接

# UDP配置
PORT = 8888  # UDP服务监听的端口号，需要与发送端保持一致

# LED引脚配置（用于指示WiFi状态）
#led = Pin(2, Pin.OUT)  # 初始化GPIO2引脚为输出模式，用于控制板载LED

def setup_ap():
    '''
    设置ESP32/ESP8266作为WiFi接入点
    
    功能：
        1. 初始化并激活WiFi接入点模式
        2. 配置WiFi名称和密码
        3. 等待接入点完全启动
    
    返回值：
        ap: network.WLAN对象，表示配置好的WiFi接入点
    '''
    ap = network.WLAN(network.AP_IF)  # 创建WiFi接入点接口
    ap.active(True)  # 激活WiFi接入点
    ap.config(essid=SSID, password=PASSWORD)  # 配置WiFi名称和密码
    
    # 等待AP启动，确保WiFi接入点完全激活
    while not ap.active():
        pass
    
    print('WiFi接入点已启动')
    print(f'SSID: {SSID}')
    print(f'IP地址: {ap.ifconfig()[0]}')
    """具体解释：1. ap.ifconfig()返回一个包含4个元素的元组，
     分别是：(IP地址, 子网掩码, 网关地址, DNS服务器地址) 
     2. [0]表示获取元组中的第一个元素，也就是IP地址"""
    return ap

def init_socket():
    '''
    初始化UDP套接字
    
    功能：
        1. 创建UDP套接字对象
        2. 绑定到指定端口，接收所有网络接口的数据
    
    返回值：
        sock: socket.socket对象，配置好的UDP套接字
    '''
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建UDP套接字
    sock.bind(('', PORT))  # 绑定空地址和端口，接收所有网络接口的数据
    return sock

def handle_key_event(key_name):
    '''
    处理按键事件
    
    参数：
        key_name: str，接收到的按键名称
    
    功能：
        根据接收到的按键名称执行相应的控制操作：
        - 'w': 前进
        - 's': 后退
        - 'a': 左转
        - 'd': 右转
        - 'space': 停止
    '''
    if key_name == 'w':
        print('前进')
        # 添加控制代码，例如控制电机前进
    elif key_name == 's':
        print('后退')
        # 添加控制代码，例如控制电机后退
    elif key_name == 'a':
        print('左转')
        # 添加控制代码，例如控制左转
    elif key_name == 'd':
        print('右转')
        # 添加控制代码，例如控制右转
    elif key_name == 'space':
        print('停止')
        # 添加控制代码，例如停止所有电机

def main():
    '''
    主程序
    
    功能：
        1. 初始化WiFi接入点
        2. 初始化UDP通信
        3. 通过LED指示系统状态
        4. 持续监听并处理UDP数据包
    '''
    # 设置WiFi接入点
    ap = setup_ap()
    
    # 初始化UDP套接字
    sock = init_socket()
    print(f'UDP服务已启动，监听端口：{PORT}')


    # LED快闪两次表示启动成功
    # for _ in range(2):
    #     led.on()  # 点亮LED
    #     time.sleep(0.1)  # 延时100ms
    #     led.off()  # 熄灭LED
    #     time.sleep(0.1)  # 延时100ms


    while True:
        try:
            # 接收UDP数据包，最大接收1024字节
            data, addr = sock.recvfrom(1024)
            key_name = data.decode().strip()  # 解码并去除空白字符
            print(f'收到按键：{key_name}，来自：{addr}')
            
            # 处理接收到的按键事件
            handle_key_event(key_name)
            
            # # LED闪烁表示收到数据
            # led.on()
            # time.sleep(0.05)  # 短暂延时50ms
            # led.off()
            #
        except Exception as e:
            # 捕获并打印所有可能的异常
            print(f'错误：{str(e)}')

if __name__ == '__main__':
    main()